package cn.com.sinux.spring.commons;

import org.apache.commons.lang.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.PropertiesFactoryBean;

import java.io.IOException;
import java.util.Properties;
import java.util.Set;

/**
 * Created 2008-9-1 下午06:34:23
 * History:
 * 1. 添加返回所有参数Map的方法
 * 2. 添加获取整型、布尔型值的方法
 */
public final class SystemConfig extends PropertiesFactoryBean {

    private static Properties globalProperties;


    public static String getProperty(String key) {
        return (String) globalProperties.get(key);
    }

    public static Properties getProperties() {
        return globalProperties;
    }

    public static String getTrimProperty(final String key) {
        return StringUtils.trimToEmpty((String) globalProperties.get(key));
    }

    public static Set<String> getPropertyKeys() {
        return globalProperties.stringPropertyNames();
    }

    public static String getProperty(final String key, final String defaultString) {
        String prop = getProperty(key);
        return StringUtils.isBlank(prop) ? defaultString : prop;
    }

    /**
     * 获取配置文件中的参数值.
     *
     * @param key 参数名称.
     * @return 参数值.
     */
    public static int getIntProperty(final String key) {
        return getIntProperty(key, 0);
    }

    /**
     * 获取配置文件中的参数值.
     *
     * @param key          参数名称.
     * @param defaultValue 默认值.
     * @return 参数值.
     */
    public static int getIntProperty(final String key, int defaultValue) {
        String property = StringUtils.trimToNull(getProperty(key));
        if (property == null) return defaultValue;
        int value;
        try {
            value = Integer.parseInt(property);
        } catch (NumberFormatException e) {
            value = defaultValue;
            LoggerFactory.getLogger(SystemConfig.class).warn(e.getMessage());
        }
        return value;
    }


    /**
     * 获取配置文件中的参数值.
     *
     * @param key          参数名称.
     * @param defaultValue 默认值.
     * @return 参数值.
     */
    public static long getLongProperty(final String key, long defaultValue) {
        String property = StringUtils.trimToNull(getProperty(key));
        if (property == null) {
            return defaultValue;
        }
        long value;
        try {
            value = Long.parseLong(property);
        } catch (NumberFormatException e) {
            value = defaultValue;
            LoggerFactory.getLogger(SystemConfig.class).warn(e.getMessage());
        }
        return value;
    }

    /**
     * 获取配置文件中的整型参数值.
     *
     * @param key 参数名称.
     * @return 整型参数值.
     */
    public static Integer getIntegerProperty(final String key) {
        return getIntegerProperty(key, null);
    }

    /**
     * 获取配置文件中的整型参数值.
     *
     * @param key          参数名称.
     * @param defaultValue 缺省值.
     * @return 整型参数值.
     */
    public static Integer getIntegerProperty(final String key, final Integer defaultValue) {
        String strVal = StringUtils.trimToNull(getProperty(key));
        Integer value = defaultValue;
        if (strVal != null) {
            try {
                value = Integer.parseInt(strVal);
            } catch (NumberFormatException e) {
                LoggerFactory.getLogger(SystemConfig.class).warn(e.getMessage());
            }
        }
        return value;
    }

    /**
     * 获取配置文件中的布尔参数值.
     *
     * @param key 参数名称.
     * @return 布尔参数值.
     */
    public static boolean getBooleanProperty(final String key) {
        return getBooleanProperty(key, false);
    }

    /**
     * 获取配置文件中的布尔参数.如果文件中没有该参数就返回defaultValue.
     *
     * @param key          参数名称.
     * @param defaultValue 参数默认值.
     * @return 布尔参数值.
     */
    public static boolean getBooleanProperty(final String key, final boolean defaultValue) {
        if (globalProperties == null) {
            return defaultValue;
        }

        Object value = globalProperties.get(key);

        if (null != value) {
            String strValue = StringUtils.trimToNull(value.toString());

            return "true".equalsIgnoreCase(strValue) || "on".equalsIgnoreCase(strValue)
                    || "yes".equalsIgnoreCase(strValue) || "1".equalsIgnoreCase(strValue);
        } else {
            return defaultValue;
        }
    }


    protected Properties createProperties() throws IOException {
        globalProperties = super.createProperties();
        return globalProperties;
    }
}
